//
//  TFTableViewController.h
//  TFFoundation
//
//  Created by TFAppleWork-Summer on 2017/4/26.
//  Copyright © 2017年 TFAppleWork-Summer. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "TFTableViewControllerProtocol.h"
#import "UIView+ViewState.h"
/**
 列表视图控制器
 */
@interface TFTableViewController : UIViewController<TFTableViewControllerProtocol,TFTableDataHandlerDelegate,TFTableViewManagerDelegate,UITableViewDelegate,UITableViewDataSource,ASTableDataSource,ASTableDelegate>

/**
 列表请求类对应的class

 @return Class
 */
- (nonnull Class)tableDataRequestClass;

/**
 item对应的class,子类重载此方法，设置对应的item，若返回为空则，使用TFTableViewItem

 @return Class
 */
- (nonnull Class)tableViewItemClass;

/**
 cell对应的class，子类可以重载此方法定制对应的cell

 @return Class
 */
- (nonnull Class)tableViewCellClass;

/**
 cellNode对应的class，子类可以重载此方法定制对应的cellNode

 @return Class
 */
- (nonnull Class)tableViewCellNodeClass;

/**
 cell重载时调用，子类重写此方法，去设置cell的属性等等

 @param cell cell
 @param indexPath 索引
 */
- (void)cellReload:(nonnull __kindof UITableViewCell *)cell atIndexPath:(nonnull NSIndexPath *)indexPath;

/**
 cellNode重载时调用，子类重写此方法，去设置cellNode的属性等等

 @param cellNode cellNode
 @param indexPath 索引
 */
- (void)cellNodeReload:(nonnull __kindof ASCellNode *)cellNode atIndexPath:(nonnull NSIndexPath *)indexPath;

/**
 子类通过重载该方法修改默认的section，此方法只会在提交section创建时调用一次

 @param section TFTableViewSection
 */
- (void)shouldUpdateTableViewSection:(nonnull TFTableViewSection *)section;

/**
 子类通过重载该方法修改默认的item，此方法只会在提交item创建时调用一次

 @param item TFTableViewItem
 */
- (void)shouldUpdateTableViewItem:(nonnull TFTableViewItem *)item;

/**
 显示stateView
 
 @param viewState view的状态
 */
- (void)showStateViewWithViewState:(kTFViewState)viewState;

/**
 编辑stateView显示对应的block

 @param viewState view的状态
 @param configModel 配置model
 */
- (void)editStateViewWithViewState:(kTFViewState)viewState configModel:(nonnull TFStateViewConfigModel *)configModel;

/**
 应该添加下拉刷新
 */
- (void)shouldAddPullDownRefresh;

/**
 应该开始下拉刷新
 */
- (void)shouldBeginPullDownRefresh;

/**
 应该结束下拉刷新
 */
- (void)shouldEndPullDownRefresh;

/**
 应该添加上拉刷新
 */
- (void)shouldAddPullUpRefresh;

/**
 应该结束下拉刷新
 */
- (void)shouldEndPullUpRefresh;

/**
 应该删除下拉刷新
 */
- (void)shouldRemovePullDownRefresh;

/**
 应该删除上拉刷新
 */
- (void)shouldRemovePullUpRefresh;

/**
 完成加载数据

 @param loadDataOption 加载数据方式
 */
- (void)didFinishLoadDataWithLoadDataOption:(TFTableLoadDataOptions)loadDataOption;

/**
 是否使用下拉刷新加载数据

 @param usePullDownRefresh 是否使用下拉刷新
 */
- (void)reloadDataUsePullDownRefresh:(BOOL)usePullDownRefresh;

/**
 刷新头部类
 
 @return Class
 */
- (nullable Class)mj_headerClass;

/**
 刷新尾部类

 @return Class
 */
- (nullable Class)mj_footerClass;

@end
